Kubernetes服務(wù)是集群中部署的一組 pod 的邏輯抽象(它們都執(zhí)行相同的功能)。由于 Pod 是短暫的,因此服務(wù)可以為一組提供特定功能(Web 服務(wù)、圖像處理等)的 Pod 分配一個(gè)名稱和唯一的 IP 地址(clusterIP)。只要服務(wù)正在運(yùn)行該 IP 地址,它就不會(huì)改變。服務(wù)還為其訪問定義策略。
在 Kubernetes 中,服務(wù)和部署有什么區(qū)別?
在Kubernetes中,部署是一種使用容器化應(yīng)用程序啟動(dòng) pod 并確保集群上始終運(yùn)行必要數(shù)量的副本的方法。另一方面,服務(wù)負(fù)責(zé)向這些 pod 公開接口,這使得可以從集群內(nèi)部或外部進(jìn)程與服務(wù)之間進(jìn)行網(wǎng)絡(luò)訪問。
Kubernetes 服務(wù)的組件有哪些?
Kubernetes 服務(wù)將一組 pod 連接到一個(gè)抽象的服務(wù)名稱和 IP 地址。服務(wù)提供 pod 之間的發(fā)現(xiàn)和路由。例如,服務(wù)將應(yīng)用程序前端連接到其后端,每個(gè)后端都在集群中的單獨(dú)部署中運(yùn)行。服務(wù)使用標(biāo)簽和選擇器將 pod 與其他應(yīng)用程序匹配。Kubernetes 服務(wù)的核心屬性是:
- 定位 pod 的標(biāo)簽選擇器
- clusterIP IP 地址和分配的端口號(hào)
- 端口定義
- 傳入端口到 targetPort 的可選映射
可以在沒有 pod 選擇器的情況下定義服務(wù)。例如,將服務(wù)指向不同命名空間或集群中的另一個(gè)服務(wù)。
Kubernetes 服務(wù)有哪些類型?
- 集群IP。公開只能從集群內(nèi)部訪問的服務(wù)。
- 節(jié)點(diǎn)端口。通過每個(gè)節(jié)點(diǎn) IP 上的靜態(tài)端口公開服務(wù)。
- 負(fù)載均衡器。通過云提供商的負(fù)載均衡器公開服務(wù)。
- 外部名稱。通過返回 CNAME 記錄的值將服務(wù)映射到預(yù)定義的 externalName 字段。
什么是 Kubernetes ClusterIP 服務(wù)?
ClusterIP 是默認(rèn)的服務(wù)類型,用于在集群內(nèi)部的 IP 地址上公開服務(wù)。僅允許從集群內(nèi)部訪問。
什么是 Kubernetes 無頭服務(wù)?
不需要負(fù)載平衡且僅公開單個(gè) IP 的服務(wù)可以通過將 clusterIP 指定為“none”來創(chuàng)建“無頭”服務(wù)??梢允褂眠x擇器定義無頭服務(wù),在這種情況下,端點(diǎn)記錄在 API 中創(chuàng)建,修改 DNS 以返回指向公開服務(wù)的 pod 的地址。沒有選擇器的無頭服務(wù)不會(huì)創(chuàng)建端點(diǎn)記錄。DNS 系統(tǒng)為與服務(wù)同名的端點(diǎn)配置 CNAME 記錄或記錄。
什么是 Kubernetes NodePort 服務(wù)?
NodePorts 是每個(gè)集群節(jié)點(diǎn)上的開放端口。Kubernetes 會(huì)將進(jìn)入 NodePort 的流量路由到服務(wù),即使該服務(wù)沒有在該節(jié)點(diǎn)上運(yùn)行。NodePort 旨在作為其他更高級(jí)別的入口方法(例如負(fù)載平衡器)的基礎(chǔ),并且在開發(fā)中很有用。
什么是 Kubernetes ExternalName 服務(wù)?
ExternalName 服務(wù)與其他 Kubernetes 服務(wù)類似;但是,它不是通過 clusterIP 地址訪問,而是返回一個(gè) CNAME 記錄,其值在創(chuàng)建服務(wù)時(shí)在 externalName: 參數(shù)中定義。
什么是 Kubernetes 負(fù)載均衡器服務(wù)?
對(duì)于在 AWS 或 Azure 等公共云提供商上運(yùn)行的集群,創(chuàng)建負(fù)載 LoadBalancer 服務(wù)提供了與 clusterIP 服務(wù)等效的功能,將其擴(kuò)展到特定于云提供商的外部負(fù)載均衡器。Kubernetes 將自動(dòng)創(chuàng)建負(fù)載均衡器,在需要時(shí)提供防火墻規(guī)則,并使用云提供商分配的外部 IP 地址填充服務(wù)。
Kubernetes 服務(wù)如何工作?
服務(wù)只是使用標(biāo)簽指向 pod。由于服務(wù)不是特定于節(jié)點(diǎn)的,因此服務(wù)可以指向一個(gè) pod,而不管它在任何給定時(shí)刻在集群中的哪個(gè)位置運(yùn)行。通過公開服務(wù) IP 地址和 DNS 服務(wù)名稱,只要服務(wù)存在,就可以通過任一方法訪問應(yīng)用程序。
您如何定義 Kubernetes 服務(wù)?
服務(wù)在 YAML 中定義,所有 Kubernetes 對(duì)象也是如此。假設(shè)您部署了運(yùn)行后端服務(wù)的 pod,以處理來自 Web 前端的數(shù)據(jù)。要在部署“deployment-backend”上公開名為“service-backend”的服務(wù),您可以使用:
api版本: v1
種類:服務(wù)
元數(shù)據(jù):
名稱:服務(wù)后端
規(guī)格:
端口:
- 端口: 4000
協(xié)議: TCP
目標(biāo)端口: 333
選擇器:
運(yùn)行:部署后端
類型:集群IP
將創(chuàng)建服務(wù)“service-backend”,集群中的任何 pod 都可以通過 http://service-backend:4000 在其端口 333 上訪問它,或者使用端口 4000 在集群的 IP 地址上訪問它。
Kubernetes 服務(wù)也可以使用“kubectl expose”命令創(chuàng)建,該命令不需要 YAML 文件??梢允褂靡韵旅顒?chuàng)建相同的服務(wù):
kubectl 暴露部署部署后端--端口=333--目標(biāo)端口=4000--名稱=服務(wù)后端
如何訪問 Kubernetes 服務(wù)?
有兩種方法可以發(fā)現(xiàn) Kubernetes 服務(wù):
DNS(最常見): DNS 方法是發(fā)現(xiàn)服務(wù)的推薦方法。要使用此方法,必須首先在集群上安裝 DNS 服務(wù)器。DNS 服務(wù)器監(jiān)控 Kubernetes API,當(dāng)一個(gè)新服務(wù)被創(chuàng)建時(shí),它的名字就可以用于請(qǐng)求應(yīng)用程序的輕松解析。
ENV 變量:此方法依賴于 kubelet 為運(yùn)行 pod 的每個(gè)節(jié)點(diǎn)的每個(gè)活動(dòng)服務(wù)添加環(huán)境變量。